﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Common.Exceptions.FaultContracts;
using System.ServiceModel;

namespace Sinacor.Infra.Common.Exceptions
{
    /// <summary>
    /// Exceção base para todas as exceções
    /// </summary>
    public abstract class BaseException : Exception
    {
        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BaseException()
            : base()
        {
        }

        /// <summary>
        /// Construtor que inicializa Message
        /// </summary>
        /// <param name="message">Mensagem de erro</param>
        public BaseException(string message)
            : base(message)
        {
        }

        /// <summary>
        /// Construtor que inicializa Message e InnerException
        /// </summary>
        /// <param name="message">Mensagem de erro</param>
        /// <param name="innerException">Erro que originou a Exception</param>
        public BaseException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

        /// <summary>
        /// Cria instância da falta
        /// </summary>
        /// <returns>Instância da falta</returns>
        protected abstract BaseFault CreateFaultInstance();

        /// <summary>
        /// Cria uma falta a partir da exceção
        /// </summary>
        /// <returns>Falta com o erro</returns>
        public virtual BaseFault CreateFault()
        {
            BaseFault fault = this.CreateFaultInstance();

            fault.Message = this.Message;

            return fault;
        }

        /// <summary>
        /// Cria uma exceção de falta a partir da exceção
        /// </summary>
        /// <returns>Falta com o erro</returns>
        public abstract FaultException CreateFaultException();

        public override string ToString()
        {
            StringBuilder exception = new StringBuilder(base.ToString());

            if (this.Data != null && 
                this.Data.Contains("ConfigureExceptionMessageError") &&
                !string.IsNullOrEmpty(this.Data["ConfigureExceptionMessageError"] as string))
            {
                exception.AppendLine();
                exception.AppendLine();
                exception.AppendLine("Configure Exception Message Error:");
                exception.AppendLine("------------------------------------------------------------");
                exception.Append((string)this.Data["ConfigureExceptionMessageError"]);
            }

            return exception.ToString();
        }
    }
}
